package com.ccom.api.feign;

import com.ccom.api.feign.factory.SysBaseAPIFallbackFactory;
import com.ccom.core.common.constant.ServiceNameConstants;
import com.ccom.core.common.model.dto.message.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 系统通用接口
 */
@Component
@FeignClient(
        path = ServiceNameConstants.BASE_SERVICE_URL_PREFIX + "/sys/api",
        contextId = "sysBaseApi",
        value = ServiceNameConstants.BASE_SERVICE,
        fallbackFactory = SysBaseAPIFallbackFactory.class
)
public interface SysBaseFeign {

    /**
     * 1发送系统消息
     *
     * @param message 使用构造器赋值参数 如果不设置category(消息类型)则默认为2 发送系统消息
     */
    @PostMapping("/sendSysAnnouncement")
    void sendSysAnnouncement(@RequestBody MessageDTO message);

    /**
     * 2发送消息 附带业务参数
     *
     * @param message 使用构造器赋值参数
     */
    @PostMapping("/sendBusAnnouncement")
    void sendBusAnnouncement(@RequestBody BusMessageDTO message);

    /**
     * 3通过模板发送消息
     *
     * @param message 使用构造器赋值参数
     */
    @PostMapping("/sendTemplateAnnouncement")
    void sendTemplateAnnouncement(@RequestBody TemplateMessageDTO message);

    /**
     * 4通过模板发送消息 附带业务参数
     *
     * @param message 使用构造器赋值参数
     */
    @PostMapping("/sendBusTemplateAnnouncement")
    void sendBusTemplateAnnouncement(@RequestBody BusTemplateMessageDTO message);

    /**
     * 5通过消息中心模板，生成推送内容
     *
     * @param templateDTO 使用构造器赋值参数
     * @return
     */
    @PostMapping("/parseTemplateByCode")
    String parseTemplateByCode(@RequestBody TemplateDTO templateDTO);

    /**
     * 26给指定用户发消息
     *
     * @param userIds
     * @param cmd
     */
    @GetMapping("/sendWebSocketMsg")
    public void sendWebSocketMsg(@RequestParam("userIds") String[] userIds, @RequestParam("cmd") String cmd);

    /**
     * 40发送邮件消息
     *
     * @param email
     * @param title
     * @param content
     */
    @GetMapping("/sendEmailMsg")
    void sendEmailMsg(@RequestParam("email") String email, @RequestParam("title") String title, @RequestParam("content") String content);
}
